-- $LastChangedDate: 2007-06-01 02:52:33 +0200 (Fri, 01 Jun 2007) $
-- $LastChangedRevision: 149 $
-- $LastChangedBy: vicente $

-- packages de ada
WITH Ada.Task_Identification;
USE Ada.Task_Identification;

-- packages del gimnasio
WITH Tareas.Sseguimiento;
WITH Tareas.Gmonitores;

PACKAGE Tareas.Gaparatos IS

   TYPE Aparato;

   TYPE Aparatoptr IS ACCESS ALL Aparato;
   TYPE Estadoaparato IS
         (Libre,
          Ocupado);

   TYPE Gaparatos;
   TYPE Gaparatosptr IS ACCESS ALL Gaparatos;
   TYPE Nodoaparato IS
      RECORD
         Id     : Task_Id;
         Aptr   : Aparatoptr;
         Estado : Estadoaparato;
      END RECORD;

   TASK TYPE Aparato(Ga: Tareas.Gaparatos.Gaparatosptr; Gm: Tareas.Gmonitores.Gmonitoresptr; Ss: Tareas.Sseguimiento.Sseguimientoptr) IS
      -- el aparato necesita saber quien es el gestor de aparatos para poder
      -- avisarle cuando vuelve a estar disponible para nuevos clientes.
      -- Ademas necesitamos el gestor de monitores por si se produce una emergencia poder solicitar
      -- un monitor.
      -- Y tambien necesitamos el servicio de seguimiento para enviar la medicion final
      -- sobre el cliente que utilizo el aparato.

      -- Un cliente entrena en el aparato durante t unidades de tiempo
      -- segun los datos del cliente tendra mas o menos probabilidades de tener
      -- problemas en la ejecucion de un ejercicio
      ENTRY Entrenar (
            Ej          : IN     Ejerciciotype;
            T           : IN     Duration;
            Cliente     :        Datosclienteptr;
            Vete_A_Casa :    OUT Boolean);
      ENTRY Acabar;
   END Aparato;

   TASK TYPE Gaparatos IS
      -- Da de alta un aparato en el gestor de aparatos
      ENTRY Add_Aparato (
            Aparid : IN     Task_Id;
            A      : IN     Aparatoptr);

      -- Devuelve en 'a' un aparato disponible en el que se puede hacer el
      -- ejercicio 'ejerc'
      ENTRY Get_Aparato (
            A     :    OUT Aparatoptr;
            Ejerc : IN     Ejerciciotype);

      -- Informa al gestor de aparatos que el aparato con id 'AparId' vuelve a
      -- estar disponible
      ENTRY Aparatofree (
            Aparid : IN     Task_Id);
      ENTRY Acabar;
   END Gaparatos;

END Tareas.Gaparatos;
